package designpatterns.chainofresponsibility.negative;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

//需求：开发现场要对接项目，不知道是谁，只能一个一个问。
public class Client {
    public static List<Person> personList = new ArrayList<>();//开发现场所有人员

    public static void main(String[] args) {
        //现场人员
        Person p2 = new Person("p1", Project.PERMISSION_SYSTEM, null);
        Person p3 = new Person("p2", Project.LOG_SYSTEM, null);
        Person p1 = new Person("p3", Project.LOGISTICS_SYSTEM, null);
        personList.add(p1);
        personList.add(p2);
        personList.add(p3);
        Person me = new Person("w", Project.PORTAL_SYSTEM, null);

        me.setExpectProject(Project.PERMISSION_SYSTEM);
        Person person = findPerson(me);
        System.out.println(person == null ? "现场无期望负责人" : "现场负责人为：" + person.getName());

        me.setExpectProject(Project.LOGISTICS_SYSTEM);
        Person person02 = findPerson(me);
        System.out.println(person02 == null ? "现场无期望负责人" : "现场负责人为：" + person02.getName());

        me.setExpectProject(null);
        Person person03 = findPerson(me);
        System.out.println(person03 == null ? "现场无期望负责人" : "现场负责人为：" + person03.getName());


        //这样虽然能解决问题，但是人非常多的话，所有人都要问一遍，效率太低。在实际中，人与人之间的关系都是有关联的，我们可以找一个人，让他带我们去找具体的负责人。
    }


    public static Person findPerson(Person me) {
        if (me == null || me.getExpectProject() == null) return null;
        for (Person person : personList) {
            if (me.talk(person)) return person;

        }
        return null;
    }
}


//每个人都有名字和负责的项目
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {
    private String name;
    private Project myProject;//负责的项目
    private Project expectProject;//期望对接的项目

    //对话，判断我的期望项目是否与对方负责的项目一致
    public boolean talk(Person p) {
        return this.myProject != null && this.expectProject != null && this.expectProject.equals(p.myProject);
    }
}


enum Project {
    PERMISSION_SYSTEM, LOG_SYSTEM, PORTAL_SYSTEM, LOGISTICS_SYSTEM, DEVOPS_SYSTEM;
}



